地图标注视图
最后更新时间:2019年6月17日
标注视图,即冒泡弹框的信息窗口,一般用于显示标注点的详细信息,如文字描述、图片等。标注视图实现方法如下:
(1) 创建标注:和创建固定点标注的方法完全一致;
(2) 创建地图视图标注的监听器,并设置给地图视图对象。在监听的mapViewViewForAnnotation()回调方法中执行标注视图的创建工作,根据标注对象构建标注视图,并赋予其他样式信息。
默认标注视图具有固定默认的显示模板,只展示标题和描述信息。
//实例化标注对象(参数:名称、描述、位置点、图标) Annotation annotation = new Annotation("MyAnnotation", "地图标注", position, bmp); //监听器中有5个回调方法,各有其用 MapViewAnnotationListener annotationListener=new MapViewAnnotationListener() { @Override public void mapViewClickAnnotation(MapView mapView, Annotation annotation) { //点击标注时响应 } @Override public void mapViewClickAnnotationView(MapView mapView, AnnotationView annotationView) { //点击标注视图时响应 } @Override public AnnotationView mapViewViewForAnnotation(MapView mapView, Annotation annotation) { //根据标注获取标注视图 //创建标注视图(标注对象、上下文) AnnotationView annotationView = new AnnotationView(annotation,getApplicationContext()); //说明:由于标注视图是根据标注创建的,所以自动具有标题、描述属性,不用再为其设置文字,但是可为其设置颜色 //获取标题、描述文本视图,并设置颜色 annotationView.getCalloutTitleTextView().setTextColor(Color.BLUE); annotationView.getCalloutDescriptionTextView().setTextColor(Color.BLACK); //设置气泡视图相对于标记边中心的偏移量,默认值:x = 0,y = 0 往右往下偏移取值为正,反之取值为负 annotationView.setCalloutOffset(new Point(0, 15)); //设置标记视图显示时是否自动移动到地图视图中心 annotationView.setPanToMapViewCenter(true); return annotationView; //返回标注视图 } @Override public boolean mapViewWillShowAnnotationView(MapView mapView, AnnotationView annotationView) { //标注视图即将显示时响应 return false; //如果取消显示视图,则可返回true } @Override public boolean mapViewWillHideAnnotationView(MapView mapView, AnnotationView annotationView) { //标注视图即将隐藏时响应 return false; //如果取消隐藏视图,可返回true,效果为点击地图视图不隐藏 } }; //设置标注视图监听器 mapView.setAnnotationListener(annotationListener);
实现效果如下图所示:
用户可以自定义标注视图的显示样式,包括视图的布局、控件的样式等。自定义标注视图,可以在默认标注视图(标题与描述)的基础上增加左、右视图,同样也可以使用自定义布局完全代替原有视图,提供的接口如下所示:
接口 | 功能 |
---|---|
setCalloutView() | 设置气泡视图 |
setCalloutContentView() | 设置内容视图 |
setLeftCalloutAccessoryView() | 设置左边的视图 |
setRightCalloutAccessoryView() | 设置右边的视图 |
自定义标注视图的实现方法与默认的类似,同样需要创建标注、实现标注监听事件。实现方法如下:
(1) 自定义视图xml布局文件(也可采用代码方式创建布局);
(2) 创建标注:和创建固定点标注的方法一样;
(3) 创建标注监听器,并设置给地图对象:在监听的mapViewViewForAnnotation()回调方法中构造标注视图,为视图对象设置xml布局,或者设置代码方式创建的布局。
具体实现代码如下:
//位图:作为标注的图标 Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.mipmap.annotation); //坐标点:作为标注位置 Dot position = new Dot(12735810,3563516); //实例化标注对象(参数:名称、描述、位置点、图标) Annotation annotation = new Annotation("MyAnnotation", "地图标注", position, bmp); //获取地图容器的标注图层,并向其中添加标注 mapView.getAnnotationsOverlay().addAnnotation(annotation); mapView.refresh(); //刷新地图 //地图标注监听器 MapViewAnnotationListener annotationListener=new MapViewAnnotationListener() { @Override public void mapViewClickAnnotation(MapView mapView, Annotation annotation) { //点击标注时响应 } @Override public void mapViewClickAnnotationView(MapView mapView, AnnotationView annotationView) { //点击标注视图时响应 } @Override public AnnotationView mapViewViewForAnnotation(MapView mapView, Annotation annotation) { //根据xml布局文件实例化View视图对象(布局可以根据需要随意设置) View mContents = getLayoutInflater().inflate(R.layout.custom_calloutcontentview, null); //创建标注视图(标注对象、上下文) AnnotationView annotationView = new AnnotationView(annotation,getApplicationContext()); //为标注视图设置气泡内容视图 annotationView.setCalloutContentView(mContents); //设置标记视图显示时是否自动移动到地图视图中心 annotationView.setPanToMapViewCenter(true); //返回标注视图 return annotationView; } @Override public boolean mapViewWillShowAnnotationView(MapView mapView, AnnotationView annotationView) { //标注视图即将显示时响应 return false; //如果取消显示视图,则可返回true } @Override public boolean mapViewWillHideAnnotationView(MapView mapView, AnnotationView annotationView) { //标注视图即将隐藏时响应 return false; //如果取消隐藏视图,可返回true,效果为点击地图视图不隐藏 } }; //设置标注视图监听器 mapView.setAnnotationListener(annotationListener);
实现效果如下图所示: